TypeScriptì ë§€íë íì ì íì©íì¬ ê°ì²Ž íí륌 ëì ìŒë¡ ë³ííê³ , êžë¡ë² ì í늬ìŒìŽì ì ìí ê²¬ê³ íê³ ì ì§ë³Žì ê°ë¥í ìœë륌 ìì±íë ë°©ë²ì ìì볎ìžì.
TypeScript ë§€íë íì (Mapped Types)ì íì©í ëì ê°ì²Ž ë³í: ì¢ í© ê°ìŽë
ì ì íìŽíì ê°ë ¥íê² ê°ì¡°íë TypeScriptë ê°ë°ìê° ë ìì ì ìŽê³ ì ì§ë³Žìíêž° ì¬ìŽ ìœë륌 ìì±í ì ìëë¡ ì§ìí©ëë€. ì¬êž°ì í¬ê² êž°ì¬íë íµì¬ êž°ë¥ìŽ ë°ë¡ ë§€íë íì (mapped types)ì ëë€. ìŽ ê°ìŽëììë TypeScript ë§€íë íì ì ìžê³ë¥Œ ê¹ìŽ í구íë©°, í¹í êžë¡ë² ìíížìšìŽ ì룚ì ê°ë°ì ë§¥ëœìì ê·ž êž°ë¥, ìŽì ë° ì€ì ì ì© ì¬ë¡ì ëí í¬êŽì ìž ìŽíŽë¥Œ ì ê³µí©ëë€.
íµì¬ ê°ë ìŽíŽíêž°
íµì¬ì ìŒë¡ ë§€íë íì ì Ʞ졎 íì ì ìì±ì êž°ë°ìŒë¡ ìë¡ìŽ íì ì ìì±í ì ìê² íŽì€ëë€. ë€ë¥ž íì ì í€ë¥Œ ìííê³ ê°ì ë³íì ì ì©íì¬ ìë¡ìŽ íì ì ì ìí©ëë€. ìŽë ìì±ì ë°ìŽí° íì ì ë³ê²œíê±°ë, ìì±ì ì íì ìŒë¡ ë§ë€ê±°ë, Ʞ졎 ìì±ì êž°ë°ìŒë¡ ì ìì±ì ì¶ê°íë ë± ê°ì²Žì 구조륌 ëì ìŒë¡ ìì íŽìŒ íë ìë늬ì€ìì ë§€ì° ì ì©í©ëë€.
Ʞ볞ë¶í° ììíŽ ë³Žê² ìµëë€. ê°ëší ìží°íìŽì€ë¥Œ ìŽíŽë³Žê² ìµëë€:
interface Person {
name: string;
age: number;
email: string;
}
ìŽì Person
ì 몚ë ìì±ì ì íì ìŒë¡ ë§ëë ë§€íë íì
ì ì ìíŽ ë³Žê² ìµëë€:
type OptionalPerson = {
[K in keyof Person]?: Person[K];
};
ìŽ ìì ìì:
[K in keyof Person]
ìPerson
ìží°íìŽì€ì ê° í€(name
,age
,email
)륌 ìíí©ëë€.?
ë ê° ìì±ì ì íì ìŒë¡ ë§ëëë€.Person[K]
ë ìëPerson
ìží°íìŽì€ì ìë ìì±ì íì ì ì°žì¡°í©ëë€.
결곌ì ìŒë¡ OptionalPerson
íì
ì ë€ì곌 ê°ìŽ ë³Žì
ëë€:
{
name?: string;
age?: number;
email?: string;
}
ìŽë Ʞ졎 íì ì ëì ìŒë¡ ìì íë ë§€íë íì ì ê°ë ¥íšì 볎ì¬ì€ëë€.
ë§€íë íì ì 구묞곌 구조
ë§€íë íì ì 구묞ì ë§€ì° êµ¬ì²Žì ìŽë©° ë€ì곌 ê°ì ìŒë°ì ìž êµ¬ì¡°ë¥Œ ë°ëŠ ëë€:
type NewType = {
[Key in KeysType]: ValueType;
};
ê° êµ¬ì± ìì륌 ë¶ìíŽ ë³Žê² ìµëë€:
NewType
: ìë¡ ìì±ëë íì ì í ë¹íë ìŽëŠì ëë€.[Key in KeysType]
: ìŽê²ìŽ ë§€íë íì ì íµì¬ì ëë€.Key
ëKeysType
ì ê° ë©€ë²ë¥Œ ìííë ë³ìì ëë€.KeysType
ì ì¢ ì¢ ë€ë¥ž íì ìkeyof
(OptionalPerson
ìì ì²ëŒ)ìŽì§ë§ íì ê·žë° ê²ì ìëëë€. 묞ììŽ ëŠ¬í°ëŽì ì ëìžìŽë ë ë³µì¡í íì ìŽ ë ìë ììµëë€.ValueType
: ì íì ì ìë ìì±ì íì ì ì§ì í©ëë€. ì§ì ì ìž íì (ì:string
), ìë íì ì ìì±ì êž°ë°í íì (ì:Person[K]
), ëë ìë íì ì ë ë³µì¡í ë³íìŽ ë ì ììµëë€.
ìì : ìì± íì ë³ííêž°
ê°ì²Žì 몚ë ì«ì ìì±ì 묞ììŽë¡ ë³ííŽìŒ íë€ê³ ììíŽ ë³Žìžì. ë§€íë íì ì ì¬ì©íì¬ ë€ì곌 ê°ìŽ í ì ììµëë€:
interface Product {
id: number;
name: string;
price: number;
quantity: number;
}
type StringifiedProduct = {
[K in keyof Product]: Product[K] extends number ? string : Product[K];
};
ìŽ ê²œì°, ì°ëЬë ë€ìì ìíí©ëë€:
Product
ìží°íìŽì€ì ê° í€ë¥Œ ìíí©ëë€.- ì¡°ê±Žë¶ íì
(
Product[K] extends number ? string : Product[K]
)ì ì¬ì©íì¬ ìì±ìŽ ì«ììžì§ íìží©ëë€. - ì«ìëŒë©Ž ìì±ì íì
ì
string
ìŒë¡ ì€ì íê³ , ê·žë ì§ ììŒë©Ž ìë íì ì ì ì§í©ëë€.
결곌ì ìŒë¡ StringifiedProduct
íì
ì ë€ì곌 ê°ìµëë€:
{
id: string;
name: string;
price: string;
quantity: string;
}
죌ì êž°ë¥ ë° êž°ë²
1. keyof
ë° ìžë±ì€ ìê·žëì² ì¬ì©íêž°
ìì 볎ì¬ëë žë¯ìŽ, keyof
ë ë§€íë íì
ìì
ì ìí Ʞ볞ì ìž ë구ì
ëë€. ìŽë¥Œ íµíŽ íì
ì í€ë¥Œ ìíí ì ììµëë€. ìžë±ì€ ìê·žëì²ë í€ë¥Œ 믞늬 ìì§ ëª»íì§ë§ ì¬ì í ë³ííê³ ì¶ì ë ìì±ì íì
ì ì ìíë ë°©ë²ì ì ê³µí©ëë€.
ìì : ìžë±ì€ ìê·žëì²ë¥Œ êž°ë°ìŒë¡ 몚ë ìì± ë³ííêž°
interface StringMap {
[key: string]: number;
}
type StringMapToString = {
[K in keyof StringMap]: string;
};
ì¬êž°ì StringMapì 몚ë ì«ì ê°ì ì íì ëŽìì 묞ììŽë¡ ë³íë©ëë€.
2. ë§€íë íì ëŽì ì¡°ê±Žë¶ íì
ì¡°ê±Žë¶ íì ì 조걎ì ë°ëŒ íì êŽê³ë¥Œ ííí ì ìê² íŽì£Œë TypeScriptì ê°ë ¥í êž°ë¥ì ëë€. ë§€íë íì 곌 ê²°í©í멎 ë§€ì° ì êµí ë³íìŽ ê°ë¥íŽì§ëë€.
ìì : íì ìì Null ë° Undefined ì ê±°íêž°
type NonNullableProperties = {
[K in keyof T]: T[K] extends (null | undefined) ? never : T[K];
};
ìŽ ë§€íë íì
ì T
íì
ì 몚ë í€ë¥Œ ìííê³ ì¡°ê±Žë¶ íì
ì ì¬ì©íì¬ ê°ìŽ null ëë undefined륌 íì©íëì§ íìží©ëë€. ë§ìœ ê·žë ë€ë©Ž íì
ì neverë¡ íê°ëìŽ íŽë¹ ìì±ì íšê³Œì ìŒë¡ ì ê±°í©ëë€. ê·žë ì§ ììŒë©Ž ìë íì
ì ì ì§í©ëë€. ìŽ ì ê·Œ ë°©ìì ì ì¬ì ìŒë¡ 묞ì ê° ë ì ìë null ëë undefined ê°ì ì ìžíì¬ íì
ì ë ê²¬ê³ íê² ë§ë€ê³ , ìœë íì§ì í¥ììí€ë©°, êžë¡ë² ìíížìšìŽ ê°ë°ì ìí ëªšë² ì¬ë¡ì ìŒì¹í©ëë€.
3. íšìšì±ì ìí ì ížëŠ¬í° íì
TypeScriptë ìŒë°ì ìž íì ì¡°ì ìì ì ëšìííë ëŽì¥ ì ížëŠ¬í° íì ì ì ê³µí©ëë€. ìŽë¬í íì ë€ì ëŽë¶ì ìŒë¡ ë§€íë íì ì íì©í©ëë€.
Partial
:T
íì ì 몚ë ìì±ì ì íì ìŒë¡ ë§ëëë€ (ìŽì ìì ìì 볎ì¬ì€ ê²ì²ëŒ).Required
:T
íì ì 몚ë ìì±ì íìë¡ ë§ëëë€.Readonly
:T
íì ì 몚ë ìì±ì ìœêž° ì ì©ìŒë¡ ë§ëëë€.Pick
:T
íì ìì ì§ì ë í€(K
)ë§ìŒë¡ ìë¡ìŽ íì ì ìì±í©ëë€.Omit
:T
íì ì 몚ë ìì±ìì ì§ì ë í€(K
)륌 ì ìží ìë¡ìŽ íì ì ìì±í©ëë€.
ìì : Pick
ë° Omit
ì¬ì©íêž°
interface User {
id: number;
name: string;
email: string;
role: string;
}
type UserSummary = Pick;
// { id: number; name: string; }
type UserWithoutEmail = Omit;
// { id: number; name: string; role: string; }
ìŽë¬í ì ížëŠ¬í° íì ì ë°ë³µì ìž ë§€íë íì ì ì륌 ìì±íë ìê³ ë¥Œ ëìŽì£Œê³ ìœë ê°ë ì±ì í¥ììíµëë€. í¹í êžë¡ë² ê°ë°ìì ì¬ì©ìì ê¶íìŽë ì í늬ìŒìŽì ì 컚í ì€ížì ë°ëŒ ë€ë¥ž ë·°ë ë°ìŽí° ì ê·Œ ìì€ì êŽëЬíë ë° ì ì©í©ëë€.
ì€ì ì ì© ì¬ë¡ ë° ìì
1. ë°ìŽí° ì íšì± ê²ì¬ ë° ë³í
ë§€íë íì ì ìžë¶ ìì€(API, ë°ìŽí°ë² ìŽì€, ì¬ì©ì ì ë ¥)ë¡ë¶í° ë°ì ë°ìŽí°ë¥Œ ê²ìŠíê³ ë³ííë ë° ë§€ì° ì ì©í©ëë€. ìŽë ë€ìí ìì€ë¡ë¶í° ë°ìŽí°ë¥Œ ì²ëЬíê³ ë°ìŽí° 묎결ì±ì 볎ì¥íŽìŒ íë êžë¡ë² ì í늬ìŒìŽì ìì ë§€ì° ì€ìí©ëë€. ë°ìŽí° íì ì íšì± ê²ì¬ì ê°ì í¹ì ê·ì¹ì ì ìíê³ , ìŽë¬í ê·ì¹ì ë°ëŒ ë°ìŽí° 구조륌 ìëìŒë¡ ìì í ì ììµëë€.
ìì : API ìëµ ë³ííêž°
interface ApiResponse {
userId: string;
id: string;
title: string;
completed: boolean;
}
type CleanedApiResponse = {
[K in keyof ApiResponse]:
K extends 'userId' | 'id' ? number :
K extends 'title' ? string :
K extends 'completed' ? boolean : any;
};
ìŽ ìì ë (ìë APIìì 묞ììŽìŽìë) userId
ì id
ìì±ì ì«ìë¡ ë³íí©ëë€. title
ìì±ì ì¬ë°ë¥Žê² 묞ììŽë¡ íìŽíëê³ , completed
ë booleanìŒë¡ ì ì§ë©ëë€. ìŽë ë°ìŽí° ìŒêŽì±ì 볎ì¥íê³ íì ì²ëЬìì ë°ìí ì ìë ì€ë¥ë¥Œ ë°©ì§í©ëë€.
2. ì¬ì¬ì© ê°ë¥í 컎í¬ëíž Props ìì±íêž°
React ë° ë€ë¥ž UI íë ììí¬ìì ë§€íë íì ì ì¬ì¬ì© ê°ë¥í 컎í¬ëíž props ìì±ì ëšìíí ì ììµëë€. ìŽë ë€ìí ë¡ìŒìŒê³Œ ì¬ì©ì ìží°íìŽì€ì ì ìíŽìŒ íë êžë¡ë² UI 컎í¬ëížë¥Œ ê°ë°í ë í¹í ì€ìí©ëë€.
ìì : ì§ìí ì²ëЬíêž°
interface TextProps {
textId: string;
defaultText: string;
locale: string;
}
type LocalizedTextProps = {
[K in keyof TextProps as `localized-${K}`]: TextProps[K];
};
ìŽ ìœëìì ìë¡ìŽ íì
ìž LocalizedTextProps
ë TextProps
ì ê° ìì± ìŽëŠì ì ëì¬ë¥Œ ë¶ì
ëë€. ì륌 ë€ìŽ, textId
ë 컎í¬ëíž props륌 ì€ì íë ë° ì ì©í localized-textId
ê° ë©ëë€. ìŽ íšíŽì ì¬ì©ìì ë¡ìŒìŒì ë°ëŒ ëì ìŒë¡ í
ì€ížë¥Œ ë³ê²œí ì ìë props륌 ìì±íë ë° ì¬ì©ë ì ììµëë€. ìŽë ì ì ìê±°ë ì í늬ìŒìŽì
ìŽë êµì ìì
믞ëìŽ íë«íŒê³Œ ê°ìŽ ë€ìí ì§ì곌 ìžìŽìì ìííê² ìëíë ë€êµìŽ ì¬ì©ì ìží°íìŽì€ë¥Œ 구ì¶íë ë° íìì ì
ëë€. ë³íë propsë ê°ë°ììê² ì§ìíì ëí ë ë§ì ì ìŽê¶ì ì ê³µíê³ ì ìžê³ì ìŒë¡ ìŒêŽë ì¬ì©ì 겜íì ë§ë€ ì ìë ë¥ë ¥ì ë¶ì¬í©ëë€.
3. ëì íŒ ìì±
ë§€íë íì ì ë°ìŽí° 몚ëžì êž°ë°ìŒë¡ ëì ìŒë¡ íŒ íë륌 ìì±íë ë° ì ì©í©ëë€. êžë¡ë² ì í늬ìŒìŽì ììë ë€ìí ì¬ì©ì ìí ìŽë ë°ìŽí° ì구 ì¬íì ì ìíë íŒì ë§ëë ë° ì ì©í ì ììµëë€.
ìì : ê°ì²Ž í€ë¥Œ êž°ë°ìŒë¡ íŒ íë ìë ìì±íêž°
interface UserProfile {
firstName: string;
lastName: string;
email: string;
phoneNumber: string;
}
type FormFields = {
[K in keyof UserProfile]: {
label: string;
type: string;
required: boolean;
};
};
ìŽë¥Œ íµíŽ UserProfile
ìží°íìŽì€ì ìì±ì êž°ë°ìŒë¡ íŒ êµ¬ì¡°ë¥Œ ì ìí ì ììµëë€. ìŽë ìëìŒë¡ íŒ íë륌 ì ìí íìê° ìê² íì¬ ì í늬ìŒìŽì
ì ì ì°ì±ê³Œ ì ì§ë³Žìì±ì í¥ììíµëë€.
ê³ êž ë§€íë íì êž°ë²
1. í€ ëŠ¬ë§€í (Key Remapping)
TypeScript 4.1ììë ë§€íë íì ì í€ ëŠ¬ë§€í êž°ë¥ìŽ ëì ëììµëë€. ìŽë¥Œ íµíŽ íì ì ë³íí멎ì í€ì ìŽëŠì ë°ê¿ ì ììµëë€. ìŽë íì ì ë€ë¥ž API ì구 ì¬íì ë§ì¶ê±°ë ë ì¬ì©ì ì¹íì ìž ìì± ìŽëŠì ë§ë€ê³ ì¶ì ë í¹í ì ì©í©ëë€.
ìì : ìì± ìŽëŠ ë³ê²œíêž°
interface Product {
productId: number;
productName: string;
productDescription: string;
price: number;
}
type ProductDto = {
[K in keyof Product as `dto_${K}`]: Product[K];
};
ìŽë Product
íì
ì ê° ìì± ìŽëŠì dto_
ë¡ ììíëë¡ ë³ê²œí©ëë€. ìŽë ë€ë¥ž ìŽëŠ ê·ì¹ì ì¬ì©íë ë°ìŽí° 몚ëžê³Œ API ê°ì ë§€íí ë ì ì©í©ëë€. ì í늬ìŒìŽì
ìŽ í¹ì ìŽëŠ ê·ì¹ì ê°ì§ ì ìë ì¬ë¬ ë°±ìë ìì€í
곌 ìží°íìŽì€íë êµì ìíížìšìŽ ê°ë°ìì ìíí íµí©ì ê°ë¥íê² íë¯ë¡ ì€ìí©ëë€.
2. ì¡°ê±Žë¶ í€ ëŠ¬ë§€í
í€ ëŠ¬ë§€íì ì¡°ê±Žë¶ íì 곌 ê²°í©íì¬ í¹ì êž°ì€ì ë°ëŒ ìì±ì ìŽëŠì ë°êŸžê±°ë ì ìžíë ë± ë ë³µì¡í ë³íì ìíí ì ììµëë€. ìŽ êž°ë²ì ì êµí ë³íì ê°ë¥íê² í©ëë€.
ìì : DTOìì ìì± ì ìžíêž°
interface Product {
id: number;
name: string;
description: string;
price: number;
category: string;
isActive: boolean;
}
type ProductDto = {
[K in keyof Product as K extends 'description' | 'isActive' ? never : K]: Product[K]
}
ì¬êž°ì description
곌 isActive
ìì±ì í€ê° 'description' ëë 'isActive'ìŒ ê²œì° never
ë¡ íŽìëêž° ë묞ì ìì±ë ProductDto
íì
ìì íšê³Œì ìŒë¡ ì ê±°ë©ëë€. ìŽë¥Œ íµíŽ ë€ìí ìì
ì íìí ë°ìŽí°ë§ í¬íšíë í¹ì ë°ìŽí° ì ì¡ ê°ì²Ž(DTO)륌 ìì±í ì ììµëë€. ìŽë¬í ì íì ë°ìŽí° ì ì¡ì êžë¡ë² ì í늬ìŒìŽì
ì ìµì íì ê°ìž ì 볎 볎ížì ë§€ì° ì€ìí©ëë€. ë°ìŽí° ì ì¡ ì íì êŽë š ë°ìŽí°ë§ ë€ížìí¬ë¥Œ íµíŽ ì ì¡ëëë¡ ë³Žì¥íì¬ ëìí ì¬ì©ëì ì€ìŽê³ ì¬ì©ì 겜íì í¥ììíµëë€. ìŽë êžë¡ë² ê°ìž ì 볎 ë³Žíž ê·ì 곌ë ìŒì¹í©ëë€.
3. ì ë€ëŠê³Œ íšê» ë§€íë íì ì¬ì©íêž°
ë§€íë íì ì ì ë€ëŠê³Œ ê²°í©íì¬ ë§€ì° ì ì°íê³ ì¬ì¬ì© ê°ë¥í íì ì ì륌 ë§ë€ ì ììµëë€. ìŽë¥Œ íµíŽ ë€ìí íì ì ì²ëЬí ì ìë ìœë륌 ìì±í ì ììŒë©°, ìœëì ì¬ì¬ì©ì±ê³Œ ì ì§ë³Žìì±ì í¬ê² ëì¬ ëê·ëªš íë¡ì ížë êµì íìì í¹í ì ì©í©ëë€.
ìì : ê°ì²Ž ìì± ë³íì ìí ì ë€ëŠ íšì
function transformObjectValues(obj: T, transform: (value: T[K]) => U): {
[P in keyof T]: U;
} {
const result: any = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = transform(obj[key]);
}
}
return result;
}
interface Order {
id: number;
items: string[];
total: number;
}
const order: Order = {
id: 123,
items: ['apple', 'banana'],
total: 5.99,
};
const stringifiedOrder = transformObjectValues(order, (value) => String(value));
// stringifiedOrder: { id: string; items: string; total: string; }
ìŽ ìì ìì transformObjectValues
íšìë ì ë€ëŠ(T
, K
, U
)ì íì©íì¬ T
íì
ì ê°ì²Ž(obj
)ì Tì ëšìŒ ìì±ì ë°ì U íì
ì ê°ì ë°ííë ë³í íšì륌 ìžìë¡ ë°ìµëë€. ê·žë° ë€ì ìŽ íšìë ìë ê°ì²Žì ëìŒí í€ë¥Œ ê°ì§ì§ë§ ê°ì U íì
ìŒë¡ ë³íë ìë¡ìŽ ê°ì²Žë¥Œ ë°íí©ëë€.
ëªšë² ì¬ë¡ ë° ê³ ë € ì¬í
1. íì ìì ì±ê³Œ ìœë ì ì§ë³Žìì±
TypeScriptì ë§€íë íì ì ê°ì¥ í° ìŽì ì€ íëë í¥ìë íì ìì ì±ì ëë€. ëª íí íì ì ì ìíšìŒë¡ìš ê°ë° ìŽêž°ì ì€ë¥ë¥Œ ë°ê²¬íì¬ ë°íì ë²ê·žì ê°ë¥ì±ì ì€ìŒ ì ììµëë€. í¹í ëê·ëªš íë¡ì ížìì ìœë륌 ì¶ë¡ íê³ ëŠ¬í©í ë§íêž° ìœê² ë§ëëë€. ëí, ë§€íë íì ì ì¬ì©í멎 ìíížìšìŽê° ì ìžê³ ìë°±ë§ ì¬ì©ìì ì구ì ë§ê² íì¥ë ë ì€ë¥ ë°ì ê°ë¥ì±ìŽ ì€ìŽëëë€.
2. ê°ë ì±ê³Œ ìœë ì€íìŒ
ë§€íë íì ì ê°ë ¥í ì ìì§ë§, ëª ííê³ ìœêž° ì¬ìŽ ë°©ììŒë¡ ìì±íë ê²ìŽ ì€ìí©ëë€. ì믞 ìë ë³ì ìŽëŠì ì¬ì©íê³ ë³µì¡í ë³íì 목ì ì ì€ëª íêž° ìíŽ ìœëì 죌ìì ë€ìžì. ìœëì ëª íì±ì 몚ë 배겜ì ê°ë°ìê° ìœë륌 ìœê³ ìŽíŽí ì ìëë¡ ë³Žì¥í©ëë€. ì€íìŒë§, ìŽëŠ ì§ì ê·ì¹ ë° ììì ìŒêŽì±ì ìœë륌 ë ì ê·Œíêž° ìœê² ë§ë€ê³ , í¹í ë€ë¥ž ë©€ë²ê° ìíížìšìŽì ë€ë¥ž ë¶ë¶ì ìì íë êµì íìì ë ìíí ê°ë° íë¡ìžì€ì êž°ì¬í©ëë€.
3. 곌ì©ê³Œ ë³µì¡ì±
ë§€íë íì ì 곌ì©ì íŒíìžì. ê°ë ¥íì§ë§, 곌ëíê² ì¬ì©ëê±°ë ë ê°ëší íŽê²°ì± ìŽ ìì ë ìœë륌 ë ìœêž° ìœê² ë§ë€ ì ììµëë€. ê°ëší ìží°íìŽì€ ì ìë ê°ëší ì ížëŠ¬í° íšìê° ë ì ì í íŽê²°ì± ìŽ ë ì ìëì§ ê³ ë €íŽ ë³Žìžì. íì ìŽ ì§ëì¹ê² ë³µì¡íŽì§ë©Ž ìŽíŽíê³ ì ì§íêž° ìŽë €ìž ì ììµëë€. íì íì ìì ì±ê³Œ ìœë ê°ë ì± ì¬ìŽì ê· íì ê³ ë €íìžì. ìŽ ê· íì ë§ì¶ë ê²ì êµì íì 몚ë ë©€ë²ê° ìœëë² ìŽì€ë¥Œ íšê³Œì ìŒë¡ ìœê³ , ìŽíŽíê³ , ì ì§í ì ìëë¡ ë³Žì¥í©ëë€.
4. ì±ë¥
ë§€íë íì ì ì£Œë¡ ì»ŽíìŒ ìê°ì íì ê²ì¬ì ìí¥ì 믞ì¹ë©° ìŒë°ì ìŒë¡ ìë¹í ë°íì ì±ë¥ ì€ë²í€ë륌 ì ë°íì§ ììµëë€. ê·žë¬ë ì§ëì¹ê² ë³µì¡í íì ì¡°ìì 컎íìŒ íë¡ìžì€ë¥Œ ëëŠ¬ê² í ì ììµëë€. ë³µì¡ì±ì ìµìííê³ , í¹í ëê·ëªš íë¡ì ížë ë€ë¥ž ìê°ëì ê±žì³ ë€ìí 늬ìì€ ì ìœì ê°ì§ íì ê²œì° ë¹ë ìê°ì 믞ì¹ë ìí¥ì ê³ ë €íìžì.
ê²°ë¡
TypeScript ë§€íë íì ì ê°ì²Ž íí륌 ëì ìŒë¡ ë³ííêž° ìí ê°ë ¥í ë구 몚ìì ì ê³µí©ëë€. ë³µì¡í ë°ìŽí° 몚ëž, API ìíž ìì© ë° UI 컎í¬ëíž ê°ë°ì ë€ë£° ë í¹í íì ìì íê³ , ì ì§ë³Žì ê°ë¥íë©°, ì¬ì¬ì© ê°ë¥í ìœë륌 구ì¶íë ë° ë§€ì° ì€ìí©ëë€. ë§€íë íì ì ë§ì€í°íšìŒë¡ìš ë ê²¬ê³ íê³ ì ìë ¥ ìë ì í늬ìŒìŽì ì ìì±íì¬ êžë¡ë² ìì¥ì ìí ë ëì ìíížìšìŽë¥Œ ë§ë€ ì ììµëë€. êµì í곌 êžë¡ë² íë¡ì ížì 겜ì°, ë§€íë íì ì ì¬ì©í멎 ê²¬ê³ í ìœë íì§ê³Œ ì ì§ë³Žìì±ì í볎í ì ììµëë€. ì¬êž°ì ë Œìë êž°ë¥ë€ì ì ìë ¥ ìê³ íì¥ ê°ë¥í ìíížìšìŽë¥Œ 구ì¶íê³ , ìœë ì ì§ë³Žìì±ì í¥ììí€ë©°, ì ìžê³ ì¬ì©ììê² ë ëì 겜íì ì ê³µíë ë° ì€ìí©ëë€. ë§€íë íì ì ìë¡ìŽ êž°ë¥, API ëë ë°ìŽí° 몚ëžìŽ ì¶ê°ëê±°ë ìì ë ë ìœë륌 ë ìœê² ì ë°ìŽíží ì ìëë¡ í©ëë€.